import { wxGetConfigInfoAPI } from 'api/base/wx';
import { isIos, isWeixin } from 'utils/validate/browser';
import Vue from 'vue';
import config from '@/common/config';
// import { Toast } from 'vant';

/***************************
 * 微信工具类
 ***************************/

/**
 * 后台获取微信鉴权信息
 * @param {*} jsApiList : 需要获取的 config 信息 如：  ['onMenuShareAppMessage', 'onMenuShareTimeline']
 * @param {*} debug
 * @param {*} beta
 * @param {*} url
 */
export const wxCheckConfig = (jsApiList = [], debug, beta, url) => {
  // 跟后台换取鉴权信息的url 在IOS中为初始化的落地页面 在安卓中为当前页面
  url = url || (isIos && Vue.landingPageUrl ? Vue.landingPageUrl : window.location.href);
  return new Promise((resolve, reject) => {
    if ('micromessenger' != window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i)) {
      reject({
        respCode: -1,
        respMsg: `请在微信中打开此公众号`,
      });
      return;
    }
    wxGetConfigInfoAPI({
      url: url,
    }).then(({ respCode, respMsg, result }) => {
      if (respCode !== '0') {
        Toast.fail(respMsg);
        reject({
          respCode,
          respMsg,
          result,
        });
        return;
      }
      const { appId, timeStamp, nonceStr, signature } = result;

      Vue.wx.config({
        beta: !!beta,
        debug: !!debug,
        appId: appId,
        timestamp: timeStamp,
        nonceStr: nonceStr,
        signature: signature,
        jsApiList: jsApiList,
      }),
        Vue.wx.ready(function() {
          resolve({
            beta: !!beta,
            debug: !!debug,
            appId: appId,
            timestamp: timeStamp,
            nonceStr: nonceStr,
            signature: signature,
            jsApiList: jsApiList,
          });
        }),
        Vue.wx.error(function(a) {
          reject({
            respCode: -1,
            respMsg: `${a}`,
          });
          // Toast.fail(respMsg);
        });
    });
  });
};

/**
 * 微信分享
 * @param {*} title   标题，默认为当前页面title
 * @param {*} desc
 * @param {*} imgUrl
 * 
 * @description 请注意 微信分享只是设置微信公众号右上角分享按钮的内容 而不是点击触发分享，所以一般只有下面两种请教
 *   1.  页面初始化的时候就设置当前页面分享的内容 而不是默认分享
 *   2. 用户点击页面上的一个分享按钮，再设置分享的内容 但是这时候需要提示用户去点击右上角分享按钮去分享
 * 
 * @example 
 *  import {  wxShare } from 'utils/wx.js';
    wxShare(
        `微信分享`,
        `这是描述信息`,
        `http://www.yjzgo.com/lt-page/pc/static/img/Logo.e438330.png`,
        {                // 可以不填写
          debug: true
        }
      );
 */
export const wxShare = (title, desc, imgUrl, configOptions) => {
  // 获取当前页面的title
  let titleEle;
  let pagetitle = null == document.title && (titleEle = document.getElementByTagName('title')) && (0 < titleEle.length ? titleEle[0] : ' ');

  configOptions = {
    debug: false,
    beta: false,
    url: undefined,
    ...configOptions,
  };

  return new Promise((resolve, reject) => {
    wxCheckConfig(['updateAppMessageShareData', 'onMenuShareAppMessage', 'onMenuShareTimeline', 'updateTimelineShareData'], configOptions.debug, configOptions.beta)
      .then(() => {
        Vue.wx.ready(function() {
          if (Vue.wx.updateAppMessageShareData) {
            //需在用户可能点击分享按钮前就先调用
            Vue.wx.updateAppMessageShareData({
              title: title || pagetitle, // 分享标题
              desc: desc, // 分享描述
              link: configOptions.url || window.location.href, // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
              imgUrl: imgUrl, // 分享图标
              success: function() {
                // 设置成功
                resolve({});
              },
              cancel: function(e) {
                reject({
                  respCode: -1,
                  respMsg: '取消分享',
                });
              },
            });
            Vue.wx.updateTimelineShareData({
              title: title || pagetitle, //
              link: configOptions.url || window.location.href, //
              imgUrl: imgUrl, //
              success: function(e) {
                //“分享到朋友圈”及“分享到QQ空间”
                resolve({});
              },
              cancel: function(e) {
                reject({
                  respCode: -1,
                  respMsg: '取消分享',
                });
              },
            });
            return {};
          }
          if (Vue.wx.onMenuShareAppMessage) {
            // 分享给朋友;
            Vue.wx.onMenuShareAppMessage(
              {
                title: title || pagetitle, // 分享标题
                desc: desc, // 分享描述
                link: configOptions.url || window.location.href, // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                imgUrl: imgUrl, // 分享图标
              },
              function(res) {
                //这里是回调函数
                resolve({});
              },
              function(err) {
                // console.log('err:', err)
                reject({
                  respCode: -1,
                  respMsg: err || '分享失败',
                });
              }
            );
            //分享到朋友圈
            Vue.wx.onMenuShareTimeline({
              title: title || pagetitle, // 分享标题
              link: configOptions.url || window.location.href, // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
              imgUrl: imgUrl, // 分享图标
              success: function() {
                // 用户点击了分享后执行的回调函数
                resolve({});
              },
            });
          }
        });
      })
      .catch(_ => {
        reject({
          respCode: -1,
          respMsg: _.respMsg || '分享失败',
        });
      });
  });
};

/**
 * 微信支付工具类
 * 
 * @example
 *  wxPay(appid, timeStamp, nonceStr, packAge, signType, paySign)
    .then(() => {
      this.$router.push({
        path: `/order/pay-success/${orderNo}`,
        query: {
          sid: this.$route.query.sid
        }
      });
    })
    .catch(({ respCode, respMsg }) => {
      this.$dialog.alert({
        title: '支付失败',
        message: respMsg
      });
    });
 * 
 * @author 顾章华
 * @attention 请在调用此接口之前通过后台接口获取下列相关数据
 * 
 * @param {*} appid       // 参考: "wx66d1bfc3aa9fe4b2"
 * @param {*} timeStamp   // 参考:  "fA3hubqFk4wp0xEK" // 支付签名时间戳，注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
 * @param {*} nonceStr    // 参考:  "prepay_id=null"  // 支付签名随机串，不长于 32 位
 * @param {*} packAge     // 参考:  C7E0910DF8B53C84BB382B8CD5CD4286" // 统一支付接口返回的prepay_id参数值，提交格式如：prepay_id=***）
 * @param {*} signType    // 参考:  "MD5" // 签名方式，默认为'SHA1'，使用新版支付需传入'MD5'
 * @param {*} paySign     // 参考: "1582191552" // 支付签名
 * 
 */
export const wxPay = (appid, timeStamp, nonceStr, packAge, signType, paySign) => {
  return new Promise((resolve, reject) => {
    // 不是微信环境 不存在WeixinJSBridge这个全局变量所以报错
    if (!WeixinJSBridge) {
      reject({
        respCode: -1,
        respMsg: '请使用微信环境',
      });
      return;
    }

    WeixinJSBridge.invoke(
      'getBrandWCPayRequest',
      {
        appId: appid,
        timeStamp: timeStamp, // 支付签名时间戳，注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
        nonceStr: nonceStr, // 支付签名随机串，不长于 32 位
        package: packAge, // 统一支付接口返回的prepay_id参数值，提交格式如：prepay_id=***）
        signType: signType, // 签名方式，默认为'SHA1'，使用新版支付需传入'MD5'
        paySign: paySign, // 支付签名
      },
      function(res) {
        //  支付失败
        if (!res || res.err_msg == 'get_brand_wcpay_request:fail') {
          reject({
            respCode: -2,
            respMsg: '支付失败',
          });
          return;
        }
        // 支付成功
        if (res.err_msg == 'get_brand_wcpay_request:ok') {
          resolve({
            ...res,
          });
          return;
        }

        reject({
          ...res,
        });
      }
    );
  });
};

/**
 * 判断当前浏览器是否是微信内置浏览器，不然不允许访问
 *
 */
export const wxVisitCheck = () => {
  if (!isWeixin()) {
    window.location.href = config.wx.authorizeUrl;
  }
};
